iT邦幫忙

2024 iThome 鐵人賽

DAY 2
0
佛心分享-IT 人自學之術

合約開發特訓班系列 第 2

直接來看 ERC20 合約程式碼 - 轉帳 transfer()

  • 分享至 

  • xImage
  •  

一開始就直接切入看 ERC20 標準的智慧合約程式碼長什麼樣子。這段程式碼解析主要參考 hydai 海帶學長的教學影片。針對轉帳 transfer() 函式實作 ERC20 智能合約 Solidity 程式碼講解的「2022 年,我們該如何寫智能合約 - 18 - ERC20 實作 轉帳篇」。影片從 7:06 開始介紹轉帳 transfer() 函式的實作。
https://youtu.be/lEzEatQwdzQ?si=f6POuXZ8M1kAZDrW

轉帳的核心概念是,我的帳戶少了這麼多錢,而你的帳戶增加了這麼多錢。
定義一個變數叫我的餘額 myBalance,他是 _balance 的發送者。
uint256 myBalance = _balance[msg.sender];

而新的餘額 _balance[msg.sender] 會是,當前的餘額,減掉 amount 打算轉出的錢。
_balance[msg.sender] = myBalance - amount;

接收者的餘額 _balance[to] 會是收款者原本的餘額,加上 amount 這麼多錢
_balance[to] = _balance[to] + amount;

第一個要寫的檢查是,用 require 檢查我的餘額 myBalance 有沒有超過 >= 我要轉出的錢 amount。錢不夠的話,觸發類似「糟糕,錢不夠」的錯誤訊息(an “insufficient balance” error)。
檢查餘額夠不夠進行轉帳。Check if the sender has enough balance. 錯誤訊息要寫更口語的說法是 "Not enough balance"。
require(myBalance >= amount, "Insufficient balance");

第二個要寫的檢查是,用 require 檢查避免使用者不小心銷毀它。所以要檢查收款者的 address 要不是 0。要是不小心把接收者的 address 寫了 0 的話,會觸發錯誤訊息寫,如: "ERC20: transfer to the zero address"。
檢查接收者 address 是不是誤寫了零。這件事必須要避免的原因是,萬一使用者真的不小心轉帳轉到 zero address 的話,那可就像是錢投到水裡,從此從這個世界上消失。

海帶老師這邊說的「接收者」或「收款者」他是用 to 來代表。
require(to != address(0), "ERC20: transfer to the zero address");

要寫 recipient 代表收款人也可以。程式碼有一致都可以。
require(recipient != address(0), "ERC20: transfer to the zero address");

ERC20 合約開發必須確保 recipient 地址不能是零地址 zero address,這是官方規定。會有這樣的規定,主要是避免錢永遠消失。針對這一點,我還去問了到處技術研討會走跳的拉布拉多救援犬,他提到 zero address 零地址其實是一個特別的地址,沒有人擁有 zero address 的私鑰,所以如果把錢轉到這個特別的地址,就沒辦法拿出來或使用。


上一篇
合約開發特訓班三人開班
下一篇
合約錢包的簽名是什麼?
系列文
合約開發特訓班17
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言